home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / magicbit.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  6.4 KB  |  205 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *         MAGIC   Modula's  All purpose  GEM  Interface  Cadre         *
  4.  *                 ÿ         ÿ            ÿ    ÿ          ÿ             *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus in schrift-  *
  11.  * licher Form, insbesondere in Zeitschriften, sowie die Verbreitung    *
  12.  * ber Public-Domain-H„ndler bedarf der ausdrcklichen schriftlichen   *
  13.  * Genehmigung des Autors!                                              *
  14.  *                                                                      *
  15.  * Der Autor gibt hiermit die ausdrckliche Erlaubnis, das Modul jeder- *
  16.  * zeit auch im Quelltext weiterzugegeben, sofern dessen Text und ins-  *
  17.  * besondere dieser Urheberrechts-Vermerk nicht ver„ndert wird, und     *
  18.  * durch die Weitergabe kein finanzieller Nutzen entsteht. Der Autor    *
  19.  * beh„lt sich das Recht vor, diese Erlaubnis jederzeit u. ohne Angaben *
  20.  * von Grnden zu widerrufen.                                           *
  21.  *----------------------------------------------------------------------*)
  22.  
  23. IMPLEMENTATION MODULE MagicBitOps;
  24.  
  25. (*----------------------------------------------------------------------*
  26.  * Int. Vers | Datum    | Name | Žnderung                               *
  27.  *-----------+----------+------+----------------------------------------*
  28.  *  3.00     | 18.01.92 |  Hp  |                                        *
  29.  *-----------+----------+------+----------------------------------------*)
  30.  
  31.  
  32.  
  33. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  34. (*                                              *)
  35. (*$R-   Range-Checks                            *)
  36. (*$S-   Stack-Check                             *)
  37. (*                                              *)
  38. (*----------------------------------------------*)
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  46.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  47.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  48.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  49.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  50.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  51.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  52.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59. IMPORT MagicSys;
  60. IMPORT SYSTEM;
  61.  
  62. TYPE    tByte =         POINTER TO ByteSet;
  63.         tWord =         POINTER TO sBITSET;
  64.         tLong =         POINTER TO lBITSET;
  65.  
  66. VAR     b1, b2, b3:     tByte;
  67.         w1, w2, w3:     tWord;
  68.         l1, l2, l3:     tLong;
  69.  
  70. VAR     b:              POINTER TO Byte;
  71.         w:              POINTER TO sCARDINAL;
  72.         l:              POINTER TO lCARDINAL;
  73.  
  74.  
  75. PROCEDURE BitOp (op: Operation; c1, c2: ARRAY OF LOC; VAR val: ARRAY OF LOC);
  76. BEGIN
  77.  IF (HIGH (c1) = HIGH (c2)) AND (HIGH (c1) = HIGH (val)) THEN
  78.   CASE HIGH (val) OF
  79.    0: b1:= SYSTEM.ADR (c1);
  80.       b2:= SYSTEM.ADR (c2);
  81.       b3:= SYSTEM.ADR (val);
  82.       CASE op OF
  83.        and: b3^:= b1^ * b2^;|
  84.        or:  b3^:= b1^ + b2^;|
  85.        xor: b3^:= b1^ / b2^;|
  86.       END;
  87.       |
  88.    1: w1:= SYSTEM.ADR (c1);
  89.       w2:= SYSTEM.ADR (c2);
  90.       w3:= SYSTEM.ADR (val);
  91.       CASE op OF
  92.        and: w3^:= w1^ * w2^;|
  93.        or:  w3^:= w1^ + w2^;|
  94.        xor: w3^:= w1^ / w2^;|
  95.       END;
  96.       |
  97.    3: l1:= SYSTEM.ADR (c1);
  98.       l2:= SYSTEM.ADR (c2);
  99.       l3:= SYSTEM.ADR (val);
  100.       CASE op OF
  101.        and: l3^:= l1^ * l2^;|
  102.        or:  l3^:= l1^ + l2^;|
  103.        xor: l3^:= l1^ / l2^;|
  104.       END;
  105.       |
  106.    ELSE ;
  107.   END; (* CASE *)
  108.  END; (* IF *)
  109. END BitOp;
  110.  
  111. PROCEDURE SetBit (pos: sCARDINAL; VAR val: ARRAY OF LOC);
  112. BEGIN
  113.  CASE HIGH (val) OF
  114.   0: b1:= SYSTEM.ADR (val);
  115.      IF pos <  8 THEN INCL (b1^, pos);  END;
  116.      |
  117.   1: w1:= SYSTEM.ADR (val);
  118.      IF pos < 16 THEN INCL (w1^, pos);  END;
  119.      |
  120.   3: l1:= SYSTEM.ADR (val);
  121.      IF pos < 32 THEN INCL (l1^, pos);  END;
  122.      |
  123.   ELSE ;
  124.  END; (* CASE *)
  125. END SetBit;
  126.  
  127. PROCEDURE ClearBit (pos: sCARDINAL; VAR val: ARRAY OF LOC);
  128. BEGIN
  129.  CASE HIGH (val) OF
  130.   0: b1:= SYSTEM.ADR (val);
  131.      IF pos <  8 THEN EXCL (b1^, pos);  END;
  132.      |
  133.   1: w1:= SYSTEM.ADR (val);
  134.      IF pos < 16 THEN EXCL (w1^, pos);  END;
  135.      |
  136.   3: l1:= SYSTEM.ADR (val);
  137.      IF pos < 32 THEN EXCL (l1^, pos);  END;
  138.      |
  139.   ELSE ;
  140.  END; (* CASE *)
  141. END ClearBit;
  142.  
  143. PROCEDURE IsSet (pos: sCARDINAL; val: ARRAY OF LOC): BOOLEAN;
  144. BEGIN
  145.  CASE HIGH (val) OF
  146.   0: b1:= SYSTEM.ADR (val);
  147.      IF pos <  8 THEN  RETURN pos IN b1^;  END;
  148.      |
  149.   1: w1:= SYSTEM.ADR (val);
  150.      IF pos < 16 THEN  RETURN pos IN w1^;  END;
  151.      |
  152.   3: l1:= SYSTEM.ADR (val);
  153.      IF pos < 32 THEN  RETURN pos IN l1^;  END;
  154.      |
  155.   ELSE ;
  156.  END; (* CASE *)
  157. END IsSet;
  158.  
  159. PROCEDURE ShiftLeft  (VAR val: ARRAY OF LOC; num: sCARDINAL);
  160. BEGIN
  161.  CASE HIGH (val) OF
  162.   0: b1:= SYSTEM.ADR (val);  w:= CastToAddr (b1);
  163.      IF num <  8 THEN
  164.       WHILE num > 0 DO  EXCL (b1^, 7);  w^:= w^ * 2;  DEC (num);  END;
  165.      END;
  166.      |
  167.   1: w1:= SYSTEM.ADR (val);  w:= CastToAddr (w1);
  168.      IF num < 16 THEN
  169.       WHILE num > 0 DO  EXCL (w1^, 15);  w^:= w^ * 2;  DEC (num);  END;
  170.      END;
  171.      |
  172.   3: l1:= SYSTEM.ADR (val);  l:= CastToAddr (l1);
  173.      IF num < 32 THEN
  174.       WHILE num > 0 DO  EXCL (l1^, 31);  l^:= l^ * 2;  DEC (num);  END;
  175.      END;
  176.      |
  177.   ELSE ;
  178.  END; (* CASE *)
  179. END ShiftLeft;
  180.  
  181. PROCEDURE ShiftRight (VAR val: ARRAY OF LOC; num: sCARDINAL);
  182. BEGIN
  183.  CASE HIGH (val) OF
  184.   0: w:= SYSTEM.ADR (val);
  185.      IF num <  8 THEN
  186.       WHILE num > 0 DO  w^:= w^ DIV 2;  DEC (num);  END;
  187.      END;
  188.      |
  189.   1: w:= SYSTEM.ADR (val);
  190.      IF num < 16 THEN
  191.       WHILE num > 0 DO  w^:= w^ DIV 2;  DEC (num);  END;
  192.      END;
  193.      |
  194.   3: l:= SYSTEM.ADR (val);
  195.      IF num < 32 THEN
  196.       WHILE num > 0 DO  l^:= l^ DIV 2;  DEC (num);  END;
  197.      END;
  198.      |
  199.   ELSE ;
  200.  END; (* CASE *)
  201. END ShiftRight;
  202.  
  203. END MagicBitOps.
  204.  
  205.